<?php 

namespace dao;

use controladores\Logger;

class fcfDao {
	//http://www.pontikis.net/blog/how-to-use-php-improved-mysqli-extension-and-why-you-should
	
	static $servidor = DB_HOST; // e.g 'localhost' or '192.168.1.100'
	static $usuario  = DB_USER;
	static $password = DB_PASS;
	static $nombreBd = DB_NAME;
	static $con; //variable donde se guarda el objeto de la conexion mysql
	
	/*
	 * Al iniciar la clase creamos la conexion
	 */
	function __construct(){
		self::$con = self::conexion();
	}
	
	/*
	 * Conexion a la base de datos. Guarda la conexion en una variable
	 */
	static function conexion(){

		$con = new \mysqli(self::$servidor,self::$usuario,self::$password,self::$nombreBd);
		
		// check connection
		if ($con->connect_error) {
			print_r($con->connect_error);
			$this->trigger_error("ERROR_CON",$query);
		}
		$con->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;
		$con->set_charset("utf8");
		return $con;
	}
	
	/*
	* Metodo para ejecutar consultas select,devuelve array con multiples rows 
	*/
	function select($query){
	
		$rs=self::$con->query($query);
		
		if($rs === false) {
			$this->trigger_error("ERROR_SELECT",$query);
		} else {
			while($row = $rs->fetch_object()){
				$rows[] = $row;
			}
		}
		return $rows;
	}
	
	/**
	 * Metodo ejecutar consulta select devolviendo un unico registro
	 */
	function selectRow($query){
	
		$con = self::conexion();
	
		$rs=$con->query($query);

		if($rs === false) {
			$this->trigger_error("ERROR_SELECTROW",$query);
		} else {
			$row = $rs->fetch_object();
			return $row;
		}
	}
	
	/*
	 * Método para ejecutar un insert. Devuelve objeto donde podemos sacar informacion( ultimo id insertado,numero registros etc).
	 */
	function insert($query){
		
		$con = self::conexion();
		
		if($con->query($query) === false) {
			$this->trigger_error("ERROR_INSERT",$con->error);
		} else {
			$aux['last_inserted_id'] = $con->insert_id;
			$aux['affected_rows'] = $con->affected_rows;
			return $aux;
		}
	}
	
	function update($query){
		
		$con = self::conexion();

		if($con->query($query) === false) {
			$this->trigger_error("ERROR_UPDATE",$query);
		} else {
			$rs = $con->affected_rows;
			return $rs;
		}
	}
	
	
	function delete($query){
		$con = self::conexion();
		
		if($con->query($query) === false) {
			$this->trigger_error("ERROR_DELETE",$query);
		} else {
			$rs = $con->affected_rows;
			return $rs;
		}
	}
	
	function transaction(){
		try {
			/* switch autocommit status to FALSE. Actually, it starts transaction */
			$conn->autocommit(FALSE);
		
			$res = $conn->query($sql1);
			if($res === false) {
				throw new Exception('Wrong SQL: ' . $sql . ' Error: ' . $conn->error);
			}
		
			$res = $conn->query($sql2);
			if($res === false) {
				throw new Exception('Wrong SQL: ' . $sql . ' Error: ' . $conn->error);
			}
		
			$res = $conn->query($sql3);
			if($res === false) {
				throw new Exception('Wrong SQL: ' . $sql . ' Error: ' . $conn->error);
			}
		
			$conn->commit();
			echo 'Transaction completed successfully!';
		
		} catch (Exception $e) {
		
			echo 'Transaction failed: ' . $e->getMessage();
			$conn->rollback();
		}
		/* switch back autocommit status */
		$conn->autocommit(TRUE);
	}
	
		
	/*
	* Si el entorno es de desarrollo , mostramos el error con el trigger. Si no lanzamos una excepcion , la recogeremos en las funciones donde hacemos las consultas.
	*/
	function trigger_error($tipo,$msg){

		/*
		if(ENVIRONMENT == 'development'){
			print_r($error);
			self::cerrarConexion();
			trigger_error(' Database connection failed: ' . $error." QUERY ".$query,E_USER_ERROR);
		}else{*/
			//$msg = $error->error_list[0]['error'];
			self::cerrarConexion();
			throw new \mysqli_sql_exception($msg);
		//}
	}

	/*
	 * Destruimos la conexion
	 */
	static function cerrarConexion(){
		if(!self::$con->ping()) {
			mysqli_close(self::$con);
		}
	}
	
	/*
	 * Finalizamos Clase
	 */
	function __destruct(){
		@self::cerrarConexion();		
	}
	
}

?>